package br.com.toscano.contpedido.business;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import br.com.toscano.contpedido.constant.ConstantesMensagem;
import br.com.toscano.contpedido.domain.ContextoUsuario;
import br.com.toscano.contpedido.domain.Perfil;
import br.com.toscano.contpedido.domain.Usuario;
import br.com.toscano.contpedido.persistence.UsuarioDAO;
import br.com.toscano.contpedido.view.UsuarioJaExisteException;
import br.gov.frameworkdemoiselle.lifecycle.Startup;
import br.gov.frameworkdemoiselle.stereotype.BusinessController;
import br.gov.frameworkdemoiselle.template.DelegateCrud;
import br.gov.frameworkdemoiselle.transaction.Transactional;
import br.gov.frameworkdemoiselle.util.ResourceBundle;

@BusinessController
public class UsuarioBC extends DelegateCrud<Usuario, Long, UsuarioDAO> {
	
	private static final long serialVersionUID = 1L;

	@Inject
	private PerfilBC perfilBC;

	@Inject
	private ResourceBundle bundle;

	@Override
	@Transactional
	public void delete(Long id) {
		this.getDelegate().delete(id);
	}

	@Override
	@Transactional
	public void delete(List<Long> ids) {
		// TODO Auto-generated method stub
		for (Long id : ids) {
			this.delete(id);
		}
	}

	@Startup
	@Transactional
	public void load() {
		if (findAll().isEmpty()) {
			perfilBC.load();

			List<Perfil> listaPerfil = new ArrayList<Perfil>();
			listaPerfil.add(perfilBC.load(Perfil.PERFIL_ADM));
			insert(new Usuario("Administrador", "admin", "admin", "admin@gobra.com.br",listaPerfil));
		}
	}	
	
	@Override
	public Usuario insert(Usuario bean) {
		Usuario obj = this.getDelegate().verificaExistenciaLogin(bean.getLogin());
		if (obj != null) {
			throw new UsuarioJaExisteException(bundle.getString(ConstantesMensagem.MSG_ERRO_USUARIO_LOGIN_JA_CADASTRADO));
		} else {
			obj = this.getDelegate().verificaExistenciaEmail(bean.getEmail());
			if (obj != null) {
				throw new UsuarioJaExisteException(bundle.getString(ConstantesMensagem.MSG_ERRO_USUARIO_LOGIN_JA_CADASTRADO));
			} else {
				return getDelegate().insert(bean);
			}
		}
	}

	@Override
	public Usuario update(Usuario bean) {
		Usuario obj = this.getDelegate().verificaExistenciaLogin(bean.getLogin());
		if (obj != null && !obj.getId().equals(bean.getId())) {
			throw new UsuarioJaExisteException(bundle.getString(ConstantesMensagem.MSG_ERRO_USUARIO_LOGIN_JA_CADASTRADO));
		} else {
			obj = this.getDelegate().verificaExistenciaEmail(bean.getEmail());
			if (obj != null && !obj.getId().equals(bean.getId())) {
				throw new UsuarioJaExisteException(bundle.getString(ConstantesMensagem.MSG_ERRO_USUARIO_LOGIN_JA_CADASTRADO));
			} else {
				return getDelegate().update(bean);
			}
		}
	}

	@Transactional
	public ContextoUsuario logar(String login, String senha) {
		ContextoUsuario cu = null; //new ContextoUsuario();

		Usuario usuario = this.getDelegate().logar(login, senha); 
		if (usuario != null) {
			cu = new ContextoUsuario(usuario);
//			if (usuario.getListaPerfil() != null) {
//				for (Perfil perfil: usuario.getListaPerfil()) {
//					if (perfil.getListaFuncionalidade() != null) {
//						for (Funcionalidade funcionalidade: perfil.getListaFuncionalidade()) {
//							funcionalidade.getCodigo();
//						}
//					}
//					if (perfil.getListaUnidadeOrcamentaria() != null) {
//						for (UnidadeOrcamentaria uo: perfil.getListaUnidadeOrcamentaria()) {
//							uo.getId();
//						}
//					}
//				}
//			}
		}

		return cu;
	}
}